﻿using QuanLyTiemVang.BUS;
using QuanLyTiemVang.Classes;
using QuanLyTiemVang.DAO;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;

namespace QuanLyTiemVang.GUI
{
    /// <summary>
    /// Interaction logic for PhieuBanHang.xaml
    /// </summary>
    public partial class PhieuMuaHang : Window, IPhanQuyenHelper
    {
        private decimal TongTien = 0;
        private decimal SoNo = 0;
        private class SanPhamView
        {
            public string TenSanPham { get; set; }
            public string LoaiSanPham { get; set; }
            public int SoLuongMua { get; set; }
            public int DonGia { get; set; }
            public decimal ThanhTien { get; set; }
        }
        protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
        {
            base.OnMouseLeftButtonDown(e);

            // Begin dragging the window
            this.DragMove();
        }
        private List<SanPhamView> listSanPhamView = new List<SanPhamView>();
        private List<SANPHAM> listSanPham = new List<SANPHAM>();
        public PhieuMuaHang()
        {
            InitializeComponent();
            CurrentUser.Instance.AddForm(this);
            txtSoTienThanhToan.IsEnabled = false;
            tbSoLuongMua.MaxLength = 9;
            tbDonGia.MaxLength = 9;
            List<PHIEUMUAHANG> l = PhieuMuaHangDAO.GetAllPhieuMuaHang();
            if (l.Count == 0)
            {
                this.txtMaPhieu.Text = "1";
            }
            else
            {
                this.txtMaPhieu.Text = (l[l.Count - 1].MaPhieuMuaHang + 1).ToString();
            }
        }

        private void Window_Loaded_1(object sender, RoutedEventArgs e)
        {
            dgDanhSachSanPham.ItemsSource = listSanPhamView.ToList();
            dpNgayMua.SelectedDate = DateTime.Now.Date;
            dpNgayMua.IsEnabled = false;
            dpNgayThanhToan.SelectedDate = DateTime.Now.Date;
            cbMaKhachHang.ItemsSource = KhachHangDAO.GetAllKhachHangId();
            cbLoaiSanPham.ItemsSource = SanPhamDAO.GetAllTenLoaiSanPham();
        }

        private void cbMaKhachHang_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (cbMaKhachHang.SelectedItem != null)
            {
                KHACHHANG kh = new KHACHHANG() 
                {
                    MaKhachHang = int.Parse(cbMaKhachHang.SelectedValue.ToString()),
                };
                kh = KhachHangDAO.SelectKhachHangByMaKhachHang(kh);
                txtTenKhachHang.Text = kh.TenKhachHang;
                txtDiaChi.Text = kh.DiaChi;
                SoNo = decimal.Parse(kh.TienNoHienTai.ToString());
            }
        }

        private void dpNgayBan_SelectedDateChanged(object sender, SelectionChangedEventArgs e)
        {
            if (dpNgayMua.SelectedDate.HasValue)
            {
                if (dpNgayMua.SelectedDate.Value.Date < DateTime.Now.Date)
                {
                    MessageBox.Show("Ngày mua phải lớn hơn hoặc bằng ngày lập phiếu hiện tại.", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Information);
                    dpNgayMua.SelectedDate = DateTime.Now.Date;
                }
            }
        }

        private void dpNgayThanhToan_SelectedDateChanged(object sender, SelectionChangedEventArgs e)
        {
            if (dpNgayThanhToan.SelectedDate.HasValue)
            {
                if (dpNgayThanhToan.SelectedDate.Value.Date < DateTime.Now.Date)
                {
                    MessageBox.Show("Ngày thanh toán phải lớn hơn hoặc bằng ngày lập phiếu hiện tại.", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Information);
                    dpNgayThanhToan.SelectedDate = DateTime.Now.Date;
                }
            }
        }

        private void dgDanhSachSanPham_LoadingRow_1(object sender, DataGridRowEventArgs e)
        {
            e.Row.Header = (e.Row.GetIndex() + 1).ToString();

        }

        private void dgDanhSachSanPham_RowEditEnding_1(object sender, DataGridRowEditEndingEventArgs e)
        {
            SanPhamView sp = dgDanhSachSanPham.SelectedItem as SanPhamView;
            SanPhamView h = new SanPhamView();
            h.TenSanPham = sp.TenSanPham;
            h.DonGia = sp.DonGia;
            h.SoLuongMua = sp.SoLuongMua;
            h.ThanhTien = (decimal)h.SoLuongMua * (decimal)h.DonGia;
            listSanPhamView.Remove(sp);
            listSanPhamView.Add(h);

            dgDanhSachSanPham.ItemsSource = null;
            dgDanhSachSanPham.ItemsSource = listSanPham;
        }

        private void dgDanhSachSanPham_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Delete)
            {
                var dataGrid = (DataGrid)sender;
                for (int i = 0; i < listSanPhamView.Count; i++)
                {
                    listSanPhamView.Remove((SanPhamView)dataGrid.SelectedItem);
                }
                dgDanhSachSanPham.ItemsSource = null;
                dgDanhSachSanPham.ItemsSource = listSanPhamView;

                decimal tongTien = 0;
                foreach (SanPhamView item in listSanPhamView)
                {
                    tongTien += item.ThanhTien;
                }
                txtTongCong.Text = tongTien.ToString();         
            }
        }

        void IPhanQuyenHelper.SetAdminFunction()
        {
            //throw new NotImplementedException();
        }

        void IPhanQuyenHelper.SetStaffFunction()
        {
            //throw new NotImplementedException();
        }

        void IPhanQuyenHelper.SetCustomerFunction()
        {
            //throw new NotImplementedException();
        }

        void IPhanQuyenHelper.SetNonFunction()
        {
            this.Close();
        }

        private void PreviewTextInput_TextBox_Event_Handler(object sender, TextCompositionEventArgs e)
        {
            if (CheckIsNumeric(e) == false)
            {
                return;
            }
        }
        private bool CheckIsNumeric(TextCompositionEventArgs e)
        {
            uint result;
            if (!(uint.TryParse(e.Text, out result)))
            {
                e.Handled = true;
                return false;
            }
            return true;
        }

        private void tbSoLuongMua_TextChanged(object sender, TextChangedEventArgs e)
        {
            if (tbSoLuongMua.Text == string.Empty)
            {
                tbThanhTien.Text = string.Empty;
                return;
            }
            else if(uint.Parse(tbSoLuongMua.Text.ToString()) <= 0)
            {
                tbSoLuongMua.Text = string.Empty;
                tbThanhTien.Text = string.Empty;
                return;
            }
            if(tbDonGia.Text != string.Empty)
            {
                tbThanhTien.Text = (decimal.Parse(tbSoLuongMua.Text.ToString()) * decimal.Parse(tbDonGia.Text.ToString())).ToString();
            }
        }

        private void tbDonGia_TextChanged(object sender, TextChangedEventArgs e)
        {
            if (tbDonGia.Text == string.Empty)
            {
                tbThanhTien.Text = string.Empty;
                return;
            }
            else if (uint.Parse(tbDonGia.Text.ToString()) <= 0)
            {
                tbDonGia.Text = string.Empty;
                tbThanhTien.Text = string.Empty;
                return;
            }
            if (tbSoLuongMua.Text != string.Empty)
            {
                tbThanhTien.Text = (uint.Parse(tbSoLuongMua.Text.ToString()) * uint.Parse(tbDonGia.Text.ToString())).ToString();
            }
        }

        private void btnThemSanPham_Click(object sender, RoutedEventArgs e)
        {
            //if (cbMaKhachHang.SelectedItem == null)
            //{
            //    MessageBox.Show("Chưa chọn khách hàng.", "Lỗi", MessageBoxButton.OK, MessageBoxImage.Error);
            //    return;
            //}
            if (cbLoaiSanPham.SelectedItem == null)
            {
                MessageBox.Show("Chưa chọn loại sản phẩm.", "Lỗi", MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }
            if (tbTenSanPham.Text == string.Empty)
            {
                MessageBox.Show("Chưa nhập tên sản phẩm.", "Lỗi", MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }
            if (tbSoLuongMua.Text == string.Empty)
            {
                MessageBox.Show("Chưa nhập số lượng mua.", "Lỗi", MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }
            if (tbDonGia.Text == string.Empty)
            {
                MessageBox.Show("Chưa nhập đơn giá cho sản phẩm.", "Lỗi", MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }
            else
            {
                if (tbDonGia.Text.Length < 4)
                {
                    MessageBox.Show("Đơn giá phải nhập tối thiểu là 1000 đồng.", "Lỗi", MessageBoxButton.OK, MessageBoxImage.Error);
                    return;
                }
            }
            SanPhamView spv = new SanPhamView() 
            {
                TenSanPham = tbTenSanPham.Text.ToString(),
                LoaiSanPham = cbLoaiSanPham.SelectedValue.ToString(),
                SoLuongMua = int.Parse(tbSoLuongMua.Text.ToString()),
                DonGia = int.Parse(tbDonGia.Text.ToString()),
                ThanhTien = decimal.Parse(tbThanhTien.Text.ToString()),
            };
            foreach (var item in listSanPhamView)
            {
                if ((String)cbLoaiSanPham.SelectedItem == item.LoaiSanPham && tbTenSanPham.Text == item.TenSanPham)
                {
                    MessageBox.Show("Sản phẩm đã tồn tại trong danh sách.", "Lỗi", MessageBoxButton.OK, MessageBoxImage.Error);
                    return;
                }
            }
            TongTien += spv.ThanhTien;
            txtTongCong.Text = TongTien.ToString();
            txtSoTienThanhToan.Text = TongTien.ToString();
            listSanPhamView.Add(spv);
            dgDanhSachSanPham.ItemsSource = listSanPhamView.ToList();
        }

        private void txtSoTienThanhToan_TextChanged(object sender, TextChangedEventArgs e)   
        {
            if (txtSoTienThanhToan.Text == string.Empty)
            {
                //txtSoTienNo.Text = string.Empty;
                //return;
            }
            else if (decimal.Parse(txtSoTienThanhToan.Text.ToString()) < 0 || decimal.Parse(txtSoTienThanhToan.Text.ToString()) > decimal.Parse(txtTongCong.Text.ToString()))
            {
                txtSoTienThanhToan.Text = TongTien.ToString();
                return;
            }
            if (txtSoTienThanhToan.Text != string.Empty)
            {
                decimal no = SoNo;
                decimal tongcong = decimal.Parse(txtTongCong.Text.ToString());
                decimal thanhtoan = decimal.Parse(txtSoTienThanhToan.Text.ToString());
                no += tongcong - thanhtoan;
            }
        }

        private void btnLapPhieu_Click(object sender, RoutedEventArgs e)
        {
            //kiem tra du dieu kien lap phieu mua hang
            if(cbMaKhachHang.SelectedItem == null)
            {
                MessageBox.Show("Chưa chọn khách hàng.", "Lỗi", MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }
            if(listSanPhamView.Count <= 0)
            {
                MessageBox.Show("Chưa có thông tin về các sản phẩm mua.", "Lỗi", MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }

            MessageBoxResult result = MessageBox.Show("Bạn có chắc chắn muốn lập phiếu mua hàng với những thông tin trên không?", "Xác nhận lập phiếu", MessageBoxButton.YesNo, MessageBoxImage.Question);
            if (result == MessageBoxResult.No)
                return;

            //du dieu kien lap phieu mua hang
            //Kiểm tra báo cáo tồn
            List<BAOCAOTON> lstBaoCaoTon = BaoCaoTonDAO.SelectAllBaoCaoTon();
            int maBaoCaoTon = 0;
            if (lstBaoCaoTon != null)
                foreach (var bct in lstBaoCaoTon)
                {
                    if (bct.NgayBaoCao.Value.Date.Month == DateTime.Now.Date.Month && bct.NgayBaoCao.Value.Date.Year == DateTime.Now.Date.Year)
                    {
                        maBaoCaoTon = bct.MaBaoCaoTon;
                    }
                }

            if (maBaoCaoTon == 0)
            {
                BAOCAOTON bct = new BAOCAOTON
                {
                    NgayBaoCao = DateTime.Now.Date
                };
                BaoCaoTonBUS.ThemBaoCaoTon(bct);
                maBaoCaoTon = bct.MaBaoCaoTon;
                List<SANPHAM> lstSP = SanPhamDAO.GetAllSanPham();
                if (lstSP != null)
                {
                    foreach (var item in lstSP)
                    {
                        CHITIETBAOCAOTON CTBCT = new CHITIETBAOCAOTON
                        {
                            MaBaoCaoTon = maBaoCaoTon,
                            MaSanPham = item.MaSanPham,
                            TonDauKy = item.SoLuongTon,
                            SoLuongBan = 0,
                            SoLuongMua = 0,
                            TonCuoiKy = item.SoLuongTon
                        };

                        ChiTietBaoCaoTonBUS.ThemChiTietBaoCaoTon(CTBCT);
                    }
                }
            }
            //kiem tra va lap danh sach khoan chi
            DANHSACHKHOANCHI danhsachkhoanchi = DanhSachKhoanChiDAO.GetDanhSachKhoanChi(dpNgayMua.SelectedDate.Value);
            if (danhsachkhoanchi == null)
            {
                danhsachkhoanchi = new DANHSACHKHOANCHI()
                {
                    NgayChi = dpNgayMua.SelectedDate.Value,
                    TienChiPhieuMuaHang = 0,
                    TienChiPhieuHangGiaCong = 0,
                    TienChiPhieuChi = 0,
                    TongTienChi = 0,
                };
                DanhSachKhoanChiDAO.Insert(danhsachkhoanchi);
            }

            //lap phieu mua hang
            PHIEUMUAHANG phieumuahang = new PHIEUMUAHANG()
            {
                MaDanhSachKhoanChi = danhsachkhoanchi.MaDanhSachKhoanChi,
                MaKhachHang = int.Parse(cbMaKhachHang.SelectedValue.ToString()),
                NgayMua = dpNgayMua.SelectedDate.Value,
                NgayThanhToan = dpNgayThanhToan.SelectedDate.Value,
                TongCong = decimal.Parse(txtTongCong.Text.ToString()),

            };
            PhieuMuaHangDAO.Insert(phieumuahang);

            //tao va them vao database danh sach chi tiet phieu mua hang
            for (int i = 0; i < listSanPhamView.Count; i++)
            {
                //kiem tra va insert san pham
                SANPHAM sanpham = new SANPHAM()
                {
                    TenSanPham = listSanPhamView[i].TenSanPham,
                };

                sanpham = SanPhamDAO.SelectSanPhambyTenSanPham(sanpham);
                SANPHAM sanphammoi = new SANPHAM();
                if (sanpham == null)
                {
                    sanphammoi.TenSanPham = listSanPhamView[i].TenSanPham;
                    sanphammoi.SoLuongTon = listSanPhamView[i].SoLuongMua;
                    sanphammoi.MaLoaiSanPham = SanPhamDAO.getMaloaiSanPham(listSanPhamView[i].LoaiSanPham);
                    SanPhamDAO.Insert(sanphammoi);
                    sanpham = sanphammoi;
                    //MessageBox.Show("Đã tạo sản phẩm mới");
                    //Them vao chi tiet bao cao ton
                    CHITIETBAOCAOTON CTBCT = new CHITIETBAOCAOTON
                    {
                        MaBaoCaoTon = maBaoCaoTon,
                        MaSanPham = sanpham.MaSanPham,
                        TonDauKy = 0,
                        SoLuongBan = 0,
                        SoLuongMua = 0,
                        TonCuoiKy = sanpham.SoLuongTon
                    };

                    ChiTietBaoCaoTonBUS.ThemChiTietBaoCaoTon(CTBCT);
                }
                else
                {
                    //sua database so luong ton moi = so luong ton hien tai + so luong mua
                    sanpham.SoLuongTon += int.Parse(tbSoLuongMua.Text);
                    SanPhamDAO.UpdateSoLuongTon(sanpham);
                    
                }

                //lap va them vao database chi tiet phieu mua hang
                CHITIETPHIEUMUAHANG chitietphieumuahang = new CHITIETPHIEUMUAHANG()
                {
                    MaPhieuMuaHang = phieumuahang.MaPhieuMuaHang,
                    MaSanPham = sanpham.MaSanPham,
                    SoLuongMua = listSanPhamView[i].SoLuongMua,
                    DonGiaMua = listSanPhamView[i].DonGia,
                    ThanhTien = listSanPhamView[i].ThanhTien,
                };

                ChiTietPhieuMuaHangDAO.Insert(chitietphieumuahang);

                //Thêm vào báo cáo tồn
                List<CHITIETBAOCAOTON> lstCTBCT = ChiTietBaoCaoTonDAO.SelectAllChiTietBaoCaoTon();
                CHITIETBAOCAOTON CT = null;
                if(lstCTBCT != null)
                    foreach (var ct in lstCTBCT)
                    {
                        if (ct.MaBaoCaoTon == maBaoCaoTon && ct.MaSanPham == sanpham.MaSanPham)
                            CT = ct;
                    }
                if (CT != null)
                {
                    CT.SoLuongMua += listSanPhamView[i].SoLuongMua;
                    CT.TonCuoiKy = sanpham.SoLuongTon;
                    ChiTietBaoCaoTonBUS.CapNhatChiTietBaoCaoTon(CT);
                }
                
                
            }
            danhsachkhoanchi.TienChiPhieuMuaHang += decimal.Parse(txtSoTienThanhToan.Text.ToString());
            danhsachkhoanchi.TongTienChi = danhsachkhoanchi.TienChiPhieuMuaHang + danhsachkhoanchi.TienChiPhieuHangGiaCong + danhsachkhoanchi.TienChiPhieuChi;
            DanhSachKhoanChiDAO.UpdateDanhSachKhoangChi(danhsachkhoanchi);

            result = MessageBox.Show("Lập phiếu thành công. Bạn có muốn in phiếu hay không?", "Thông báo", MessageBoxButton.YesNo, MessageBoxImage.Question);
            if (result == MessageBoxResult.No)
            {
                this.Clear();
                return;
            }

            System.Windows.Forms.SaveFileDialog sfd = new System.Windows.Forms.SaveFileDialog();
            sfd.Filter = "PDF File|*.pdf";
            sfd.FileName = "PMH_" + this.txtMaPhieu.Text;
            System.Windows.Forms.DialogResult r = sfd.ShowDialog();
            if (r == System.Windows.Forms.DialogResult.Cancel)
            {
                this.Clear();
                return;
            }

            ReportBUS.PhieuMuaHangReport(phieumuahang.MaPhieuMuaHang, sfd.FileName);
            MessageBox.Show("Đã in phiếu thành công.", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Information);

            this.Clear();
        }

        private void Clear()
        {
            txtMaPhieu.Text = PhieuMuaHangDAO.GetLastMaPhieuMuaHang().ToString();
            cbMaKhachHang.SelectedItem = null;
            dpNgayThanhToan.SelectedDate = DateTime.Now.Date;
            dpNgayMua.SelectedDate = DateTime.Now.Date;
            txtTenKhachHang.Text = string.Empty;
            txtDiaChi.Text = string.Empty;
            cbLoaiSanPham.Text = string.Empty;
            tbSoLuongMua.Text = string.Empty;
            tbTenSanPham.Text = string.Empty;
            tbThanhTien.Text = string.Empty;
            txtTongCong.Text = string.Empty;
            txtSoTienThanhToan.Text = string.Empty;
            listSanPhamView.Clear();
            dgDanhSachSanPham.ItemsSource = null;
            TongTien = 0;
            SoNo = 0;
        }
        private void btnTaoPhieuMoi_Click(object sender, RoutedEventArgs e)
        {
            this.Clear();
        }

        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            this.Close();
        }

        private void btnLapPhieuNo_Click(object sender, RoutedEventArgs e)
        {
            this.Visibility = System.Windows.Visibility.Hidden;
            PhieuNo phieuno = new PhieuNo();
            phieuno.Show();
            
        }

        private void btnTraCuuKhachHang_Click(object sender, RoutedEventArgs e)
        {
            TraCuuKhachHang tracuu = new TraCuuKhachHang();
            tracuu.Show();
            //this.Hide();
        }

        private void btnThemKhachHang_Click(object sender, RoutedEventArgs e)
        {
            DangKyTaiKhoan dangky = new DangKyTaiKhoan();
            dangky.Show();
            //this.Hide();
        }

        private void cbLoaiSanPham_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            //if(cbLoaiSanPham.Text!= ")"
            tbTenSanPham.Text = cbLoaiSanPham.Text;
            tbSoLuongMua.Text = "";
            tbDonGia.Text = "";
            tbThanhTien.Text = "";
        }

    }
}
